<?php
namespace App\Http\Controllers;

use Mail;
use App\UserSmbms;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use App\Jobs\sendEmail;

class requestController extends Controller{

    // 为参数注入request类
    public function requestTest(Request $request){

        // 1.取值，input()
        // 第二个参数但没有这个字段时候取第二个字段的默认值
        echo $request->input("userName","默认")
        .$request->input("userPassword","默认");

        // 也可以使用request的方法has()判断有没有改属性
        // if($request->has("name")){
        //     echo $request->input("name");
        // }else{
        //     echo "无参数";
        // }

        // 取出request中所有的参数all()
        // 返回一个索引数组
        // $users=$request->all();
        // dd($users);
        
        // 2.判断请求方法
        echo $request->method();

            // 判断是否是哪种类型的请求isMethod()
            // 传入需要判断类型的字符串参数
            var_dump($request->isMethod("post"));

            // 判断是否是ajax请求 ajax()
            var_dump($request->ajax());

            // 判断路由请求路径的规则是否相符合
            // 例子中，参数规定，请求路径是否满足以testIs/开头(testIs/requestController)
            var_dump($request->is("testIs/*"));
            echo "<br>";
            // 获得当前请求的url,使用url()函数
            // 结果:http://localhost/laravel/test/public/testIs/requestController
            echo $request->url();
    }
    // 操作session
    public function session1(Request $request){
        // 操作session都要先用request对象获得session对象，
        // 由session对象操作session域

        // 1.设置值存入session put()
        // 获得session对象，并调取input方法往session放值
        // $request->session()->put("key1","value1");
        // 取值
        // 取得session中的值
        // echo  $request->session()->get("key1");

        // 2.使用Session类的静态方法put存入值
        // Session::put("key3","value3");
        // 取值
        // 使用类的静态方法获得session域的值,如果获取不到则只用第二个参数的默认值
        //    echo Session::get("key4","default");

        // 3.以数组的形式在session设值，一次存多个值
        // 数组里放着我们想要存的数据，这样能同时存多个数据
        Session::put([
            "key5"=>"value5",
            "key6"=>"value6"
            ]);
        // echo Session::get("key6","default");

        // 4.往session中存入数组,push()方法
        // 第一个参数为在session存入的数组的名称
        // 第二个参数为当前数组想要存入值
            // Session::push("user1","user1aaa");
            // Session::push("user1","user1bbb");
            // Session::push("user2","user2aaa");
            // 取值
            // 因为user是一个数组，所以返回的也是一个数组
            // $res=Session::get("user1");

            // 5.从session中取值,取完就删除pull()
            // 取不到就拿默认值
            // Session::pull("key6","default");

            // 6.取出session中所有的值
            dd(Session::all());
            
            // 7.判断session中是否有某个值
            // Session::has("key6");

            // 8.暂存数据
            // Session::flash("key3");

            // 9.删除session中的值forget()
            // 参数指定要删除值的键
            // Session::forget("key6");
            // 删除session中所有的值
            // Session::flush();



    }

    public function session2(Request $request){

        return Session::get("message","default");
    //    return view("layout");
        
    }
    // 文件上传
    public function uploads(Request $request){

        if($request->isMethod("POST")){

            $file=$request->file("source");

            // 判断文件上传是否成功
            if($file->isValid()){

                // 获取文件名
                $originalName=$file->getClientOriginalName();
                // 获取文件扩展名
                $ext=$file->getClientOriginalExtension();
                // 获取文件类型
                $type=$file->getClientMimeType();
                // 获取文件在服务器的临时保存位置,绝对路径
                $realPath=$file->getRealPath();
                // 给文件重新命名在服务器保存的名字
                $fileName=date('Y-m-d-H-i-s').'-'.uniqid().'.'.$ext;
                // 使用Storage的静态方法disk选择在Stroage中设置的磁盘位置uploads转为磁盘对象
                // 使用磁盘对象的put方法第一个参数传入在磁盘中文件保存的名字，
                // 第二个参数通过file_get_contents()函数传入临时保存路径解析文件之后传入第二个参数
                $bool=Storage::disk("uploads")->put($fileName,file_get_contents($realPath));
                //  var_dump($originalName. $ext.$type.$realPath.$fileName.$bool);

            }
            exit;
        }

        return view("userAdmin.uploads");
    }
    // 发送邮件
    public function sendMail(){

        // 发送普通模板内容
        // Mail::raw("邮件内容!!!!!!!!!!!!!!!!!!!",function($message){

        //     // 邮件发送地址，邮件名称
        //     $message->from("1424103108@qq.com","测试邮件名称");
        //     //邮件主题
        //     $message->subject("邮件主题 测试");
        //     // 发送方
        //     $message->to("727315614@qq.com");

        // });

        // 分页，传入需要显示的记录数
        $userList=UserSmbms::paginate(5);

            Mail::send("common.layouts",[
                "userList"=>$userList
            ],function($message){
            // 发送方
            $message->to("287747997@qq.com");

            });


    }

    // 测试缓存
    public function cache1(){

        // 1.put(),存放缓存
        // 第一个参数存放目标键值的键
        // 第二个参数存放目标键值的值
        // 第三个参数设置缓存的时间
        Cache::put("key1","value1",10);

        //2.add(),存放前判断目标键值是否存在，存在即失败，不存在即添加成功
        // $bool=Cache::add("key2","value2",9);
        // var_dump($bool);

        // 3.forever()永久保存目标键值到换粗
        // Cache::forver("key3","value3");

        // 4.has(),判断某个键是否存在
        if(Cache::has("key1")){

            $val=Cache::get("key1");
            var_dump($val);

        }else{
            echo"不存在";
        }
    }
    public function cache2(){

        // 1.get()从缓存中获取对象
        // $val=Cache::get("key1");
        // var_dump($val);

        // 2.pull(),从缓存中取出键值，取出来之后便把该键值删除
        // $val=Cache::pull("key1");
        // var_dump($val);

        // 2.forget(),从缓存中删除键值，成功返货true，失败返回false
        $val=Cache::forget("key1");
        var_dump($val);


    }
    // 测试Log
    public function testLog(){
        
        Log::info("这是一个info级别的日志");
        Log::warning("这是一个warning级别的日志",["name"=>"划水"]);
        Log::warning("这是一个warning级别的日志");

        Log::error("这是一个数组",["name"=>"划水"]);

    }
    // 测试队列
    public function queue(){
        // php artisan queue:table;创建迁移表
        // php artisan migrate;数据库生成对应表
        // php artisan make:job SendEmail;在APP\Jobs文件夹下生成对应的队列类
        // php artisan queue:failed-table;生成失败记录表
        // php artisan migrate;数据库生成对应表
        // php artisan queue:retry 1 重新执行失败队列表中的id为1的队列任务
        // php artisan queue:retry all重新执行失败队列表中的所有任务
        // php artisan queue:forget 4 删除失败队列中id为4的队列
        // php artisan queue:fulsh 删除失败队列中id为4的队列
        dispatch(new sendEmail("287747997@qq.com"));
    }
}